home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 41
/
Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso
/
Aminet
/
gfx
/
edit
/
AmiCAD_2.06.lha
/
AmiCAD
/
ARexx
/
TracerSpice.AmiCAD
< prev
next >
Wrap
Text File
|
2000-04-14
|
6KB
|
258 lines
/* Tracé d'un fichier généré par Spice dans la fenêtre AmiCAD courante */
/* Version 1.01: 27 Mai 1999, modification appel MENU */
/* Version 1.02: 4 octobre 1999, ajout affichage point de fonctionnement */
/* Version 1.03: 18 octobre 1999, amélioration affichage point de fonctionnement */
/* Version 1.04: 13 avril 2000, adaptation à la version 2.05 */
/* $VER: 1.04 (© R.Florac, 13/04/00) */
options results /* indispensable pour récupérer le résultat des macros */
signal on error /* pour l'interception des erreurs */
signal on syntax
parse arg '"'fichier'"'port
if port~="" then address value port
if fichier="" then do
'REQFILE("Fichier Spice","RAM:","*_spice")'
fichier=result
end
if fichier="" then exit
if ~open(file, fichier, 'R') then do
'MESSAGE("Fichier de données"+CHR(10)+"'fichier'"+CHR(10)+"non trouvé")'
return
end
titre=readln(file)
if left(titre,6)~="Title:" then do
'MESSAGE("Fichier de type inconnu"+CHR(10)+"En-tête:"+CHR(10)+"'titre'"):TITLE("")'
close(file)
exit
end
'LOCK:TITLE("Lecture des données...")'
date=readln(file)
plotname=readln(file)
flags=substr(readln(file),8)
nv=readln(file)
nv=substr(nv,16)
np=readln(file)
np=substr(np,13)
command=readln(file)
v=readln(file)
if v~="Variables:" then do
'UNLOCK:MESSAGE("Déclaration variables"+CHR(10)+"non trouvée"):TITLE("")'
close(file)
exit
end
v.0=readln(file)
parse value v.0 with '09'x num '09'x nom '09'x type.0
type_abcisse=type.0
if nom="sweep" then type_analyse="DC"
else if nom="time" then type_analyse="TRANSIENT"
else if nom="frequency" then type_analyse="AC"
else do
type_analyse="OP"
nom.0=nom
end
if type_analyse~="OP" then do
'SAVEALL:MODE_TRACÉ=DRAWMODE(1):ROTATE(0,0):SETSCALE(0,100,100)'
'IF(OBJECTS>0,MARKZONE(0,0,WWIDTH-1,WHEIGHT-1):MENU("Delete"),0)'
'WRITE("'substr(titre,8)||' ('||substr(plotname,11)')",15,15)'
'WRITE("Spice 'substr(command,10)||' '||substr(date,7)'",15,25)'
end
do i=1 to nv-1
v.i=readln(file)
parse value v.i with '09'x num '09'x nom.i '09'x type.i
end
v=readln(file)
if v~="Values:" then do
'UNLOCK:MESSAGE("Déclaration valeurs"+CHR(10)+"non trouvée")'
close(file)
exit
end
do i=0 to np-1
v=readln(file)
if flags = 'real' then do
parse var v p '09'x '09'x valeur
end
else parse var v p '09'x '09'x valeur ',' imaginaire
if p~=i then do
'UNLOCK:MESSAGE("Erreur de lecture"+CHR(10)+"des données"+CHR(10)+"'p'"):TITLE("")'
close(file)
exit
end
xh.i=valeur
im.i=imaginaire
if type_analyse="OP" then yd.0.0=valeur
do j=1 to nv-1
v=readln(file)
if flags='real' then parse var v '09'x p
else parse var v '09'x p ',' imaginaire
yd.i.j=p
im.i.j=imaginaire
end
end
if type_analyse~="OP" then do
/* recherche des limites des ordonnées (axe vertical) */
ymin=yd.0.1
ymax=yd.0.1
do i=0 to np-1
do j=1 to nv-1
if ymin>yd.i.j then ymin=yd.i.j
if ymax<yd.i.j then ymax=yd.i.j
end
end
/* Lecture des dimensions de la fenêtre */
xgauche=70
'WWIDTH'
largeur=result-xgauche-30
yhaut=40
'WHEIGHT'
hauteur=result-yhaut-65
/* Tracé du cadre */
'TITLE("Tracé des résultats...")'
call tracer_contour
/* Tracé de la grille */
lc=largeur%10 /* Lignes verticales */
xc=xgauche+lc
do i=1 to 9
'DRAW('xc','yhaut','xc','yhaut'+'hauteur')'
xc=xc+lc
end
yl=hauteur%10 /* Lignes horizontales */
do i=1 to 9
'DRAW('xgauche','yhaut+yl*i','xgauche+largeur','yhaut+yl*i')'
end
/* Tracé des légendes */
NUMERIC FORM ENGINEERING
NUMERIC DIGITS 5
'DRAWMODE(1):ROTATE(0,3)' /* Axe horizontal */
xc=xgauche+5
do i=0 to 10
rang=(np%10)*i
if rang>=np then rang=np-1
t=xh.rang
'WRITE("'left(t-0,6)'",'xc',WHEIGHT-10)'
xc=xc+lc
end
'WRITE("'type_abcisse'",'xc+15-lc',WHEIGHT-10)'
if ymax-ymin>1 then do /* Axe vertical */
ymin=(ymin-1)%1
ymax=(ymax+1)%1
end
'ROTATE(0,0)'
yl=hauteur%10
do i=0 to 10
rang=((ymax-ymin)/10)*i+ymin
if abs(rang)<0.00001 then rang=0
'WRITE("'left(rang-0,6,' ')'",'xgauche-50','hauteur-yl*i+yhaut')'
end
/* Tracé des courbes */
pas_valeur=1
pas_x=largeur/np
do j=1 to nv-1
i=0
x0=xgauche
y0=calcul_ordonnee(yd.0.j)
if j<4 then 'DRAWMODE('j')'
else 'DRAWMODE('0-j')'
do while i<np
v=yd.i.j
if result<1 then leave
'DRAW('x0','y0','xgauche+(pas_x*i)%1','calcul_ordonnee(v)')'
x0=xgauche+(pas_x*i)%1
y0=calcul_ordonnee(v)
i=i+pas_valeur
end
'WWIDTH-'length(nom.j)*8'-20'; xn=result
'DRAW('xn-5','j*10','xn-15','j*10')'
'DRAWMODE(1):WRITE("'nom.j'",'xn','j*10+5')'
end
type_ordonnee=type.1
do j=1 to nv-1
if type_ordonnee~=type.j then do
type_ordonnee=''
leave
end
end
if type_ordonnee~='' then 'WRITE("'type_ordonnee'",'xgauche-50','yhaut-5')'
'DRAWMODE(MODE_TRACÉ)'
end
else do
m='"Point de fonctionnement"'
do j=0 to nv-1
NUMERIC FORM ENGINEERING
/* NUMERIC DIGITS 5 */
val=yd.0.j-0
k=j
if type.k='voltage' then do
units='V'
type='Tension'
end
else do
units='A'
type='Courant'
val=0-val
end
if abs(val) < 1 then do
val = val * 1000
if abs(val) < 1 then do
val = val * 1000
if abs(val) < 1 then do
val = val * 1000
units='n'||units
end
else do
if abs(val) < 1 then do
val = val * 1000
units='p'||units
end
else units='µ'||units
end
end
else units='m'||units
end
m = m||'+CHR(10)+"'||type' 'nom.j||': '||val||' '||units||'"'
end
'MESSAGE('m')'
end
'UNLOCK:TITLE("")'
close(file)
exit
calcul_ordonnee: procedure expose ymin ymax hauteur yhaut
parse arg v
if ymax=ymin then return 0
return hauteur-((abs(v-ymin)*hauteur/abs(ymax-ymin))%1)+yhaut
tracer_contour:
'SETFILL(0):DRAWMODE(-2):DRAW('xgauche','yhaut','xgauche','yhaut+hauteur'):DRAW('xgauche','yhaut+hauteur','xgauche+largeur','yhaut+hauteur')'
'DRAW('xgauche+largeur','yhaut+hauteur','xgauche+largeur','yhaut'):DRAW('xgauche+largeur','yhaut','xgauche','yhaut'):DRAWMODE(0)'
return
/* Traitement des erreurs, interruption du programme */
syntax:
erreur=RC
'MESSAGE("Script TracerSpice"+CHR(10)+"Erreur de syntaxe"+CHR(10)+"en ligne 'SIGL'"+CHR(10)+"'errortext(erreur)'"):UNLOCK'
exit
error:
'MESSAGE("Script TracerSpice"+CHR(10)+"Erreur en ligne 'SIGL'"):UNLOCK'
exit